【AWS Backup】AWS CloudShell から CLIを使って EC2インスタンスのリストアを行う
はじめに
AWS CloudShell は マネジメントコンソール(マネコン)から AWS CLIなど実行できるサービスです。 AWS re:Invent 2020 で発表されました。
ローカル環境に実行環境構築する必要なく、 ブラウザから AWS CLIや他スクリプトを試行できることが大きなメリットです。 個人的にはマネコンベースの手順書(いわゆるスクショドキュメント)が CloudShellに置き換わらないかなと、期待している部分があります。
そんな期待を込めながら、今回は CloudShell(AWS CLI)メインで EC2インスタンスのリストアを行ってみます。
前提
リージョンは東京(ap-northeast-1
)、
バックアップ/リストア対象のEC2インスタンスは AWS Backup で日次バックアップを取得している環境を想定しています。
また、実施時の AWS CLI version情報は以下の通り。
aws --version # aws-cli/2.0.58 Python/3.7.3 Linux/4.14.209-160.335.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2
※AWS Backup の仕組みについての解説は省きます。詳細は以下ブログがとても分かりやすいので参照ください。
手順
全体の流れは以下のとおりです。
- AWS CloudShell の起動
- バックアップ/リストア対象インスタンスの選択
- リカバリポイントの選択
- リストアジョブの実行
- 確認
1. AWS CloudShell の起動
まずはマネコンにログインします。
上部 にある CloudShellアイコンをクリック、もしくは 「CloudShell へのアクセスリンク」を開きます。
- CloudShell へのアクセスリンク: https://ap-northeast-1.console.aws.amazon.com/cloudshell/home?region=ap-northeast-1
CloudShell コンソールへ入れること、 aws --version
や aws sts get-caller-identity
などで
AWS CLIが実施できること確認できればOKです。
2. バックアップ/リストア対象インスタンスの選択
ここでは バックアップ/リストア対象のEC2インスタンスのIDを取得します。
後続の処理のために TARGET_ID
に格納します。
まずは インスタンスID, Nameタグ 一覧の情報を確認します。
aws ec2 describe-instances --output table \ --query 'Reservations[*].Instances[].{ID: InstanceId, Name: Tags[?Key==`Name`]|[0].Value, State: State.Name}' #### 出力サンプル # ------------------------------------------------------ # | DescribeInstances | # +----------------------+------------------+----------+ # | ID | Name | State | # +----------------------+------------------+----------+ # | i-09xxxxxxxxxxxxxxx | xxx-instance | running | # | i-01xxxxxxxxxxxxxxx | yyy-instance | stopped | # | i-0dxxxxxxxxxxxxxxx | zzz-instance | stopped | # +----------------------+------------------+----------+
バックアップ/リストア対象のEC2インスタンスが判れば、そのIDを変数に格納しましょう。
TARGET_ID=i-01xxxxxxxxxxxxxxx
3. リカバリポイントの選択
ここでは AWS Backup の バックアップジョブ情報を取得して、
リカバリポイント(どのAMIでリストアするか)を RECOVERY_POINT
に格納します。
まずは バックアップジョブ情報を TARGET_ID
のインスタンスに絞って出力します。
ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text` TARGET_ARN="arn:aws:ec2:ap-northeast-1:$ACCOUNT_ID:instance/$TARGET_ID" echo "Listing RecoveryPointArn filterd by instance:${TARGET_ID} ...";\ aws backup list-backup-jobs --output table \ --query "BackupJobs[?ResourceArn=='${TARGET_ARN}'].{CompletionDate:CompletionDate, RecoveryPointArn:RecoveryPointArn, State:State}" #### 出力サンプル # Listing RecoveryPointArn filterd by instance:i-01xxxxxxxxxxxxxxx ... # -------------------------------------------------------------------------------------------------------------- # | ListBackupJobs | # +-----------------------------------+-----------------------------------------------------------+------------+ # | CompletionDate | RecoveryPointArn | State | # +-----------------------------------+-----------------------------------------------------------+------------+ # | 2021-01-16T10:28:03.368000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-15T11:52:14.449000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-0axxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-14T08:51:19.970000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-09xxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-13T09:23:27.157000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-07xxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-12T09:20:39.076000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-0axxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-11T11:01:24.057000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-0exxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-10T11:33:46.677000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-04xxxxxxxxxxxxxxx | COMPLETED | # | 2021-01-09T09:13:29.506000+00:00 | arn:aws:ec2:ap-northeast-1::image/ami-01xxxxxxxxxxxxxxx | COMPLETED | # +-----------------------------------+-----------------------------------------------------------+------------+
リカバリポイントを選択して、変数に格納します。
RECOVERY_POINT=arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx
4. リストアジョブの実行
ここではリストアを実行します。
リストアに必要なパラメータを準備した上で、
aws backup start-restore-job
でリストアを実行します。
▼ リストアのパラメータ取得
# バックアップボールト VAULT=`aws backup list-backup-jobs --output text --query "BackupJobs[?RecoveryPointArn=='${RECOVERY_POINT}'].BackupVaultName"` # IAMロール IAM_ROLE=`aws backup list-backup-jobs --output text --query "BackupJobs[?RecoveryPointArn=='${RECOVERY_POINT}'].IamRoleArn"` ### 以下 リストアの際のEC2インスタンス 各種メタデータ # VPC VPC=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.VpcId` # サブネット SUBNET=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.SubnetId` # インスタンスタイプ INSTANCE_TYPE=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.InstanceType` # セキュリティグループ SG_IDS=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.SecurityGroupIds | sed -e 's/\"/\\\"/g'` # IAMインスタンスプロファイル INSTANCE_PROFILE=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.IamInstanceProfileName` # EBS最適化 EBS_OPTIMIZED=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.EbsOptimized` # 終了保護 SHUTDOWN_BEHAVIOR=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \ --query RestoreMetadata.InstanceInitiatedShutdownBehavior`
※今回は VPC, サブネット, インスタンスタイプ, セキュリティグループ, IAMインスタンスプロファイル, EBS最適化, 終了保護
の情報を引き継いでリストアさせます。
他に指定したい設定がある場合は aws backup get-recovery-point-restore-metadata
でメタデータ情報を確認してください。
▼ リストアジョブの実行
aws backup start-restore-job --recovery-point-arn $RECOVERY_POINT --iam-role-arn $IAM_ROLE \ --metadata \ VpcId=$VPC,\ SubnetId=$SUBNET,\ InstanceType=$INSTANCE_TYPE,\ SecurityGroupIds="\"${SG_IDS}\"",\ IamInstanceProfileName=$INSTANCE_PROFILE,\ EbsOptimized=$EBS_OPTIMIZED,\ InstanceInitiatedShutdownBehavior=$SHUTDOWN_BEHAVIOR ### 出力サンプル # { # "RestoreJobId": "CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" # }
後続のリストア状況確認のために出力されたジョブIDをメモしておきます。
JOB_ID=CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
5. 確認
aws backup describe-restore-job
でリストアジョブの状況確認できます。
aws backup describe-restore-job --restore-job-id $JOB_ID --output table #### 出力サンプル # -------------------------------------------------------------------------------------------------- # | DescribeRestoreJob | # +-------------------+----------------------------------------------------------------------------+ # | AccountId | 123456789012 | # | BackupSizeInBytes| 8589934592 | # | CreationDate | 2021-01-17T02:28:23.488000+09:00 | # | IamRoleArn | arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole | # | PercentDone | 0.00% | # | RecoveryPointArn | arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx | # | RestoreJobId | CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | # | Status | RUNNING | # +-------------------+----------------------------------------------------------------------------+
Status:COMPLETED
になれば完了です。
aws backup describe-restore-job --restore-job-id $JOB_ID --output table #### 出力サンプル # --------------------------------------------------------------------------------------------------- # | DescribeRestoreJob | # +--------------------+----------------------------------------------------------------------------+ # | AccountId | 123456789012 | # | BackupSizeInBytes | 8589934592 | # | CompletionDate | 2021-01-17T07:03:31.079000+00:00 | # | CreatedResourceArn| arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0exxxxxxxxxxxxxxx | # | CreationDate | 2021-01-17T06:53:28.305000+00:00 | # | IamRoleArn | arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole | # | PercentDone | 0.00% | # | RecoveryPointArn | arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx | # | RestoreJobId | CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | # | Status | COMPLETED | # +--------------------+----------------------------------------------------------------------------+
CreatedResourceArn
に作成された EC2インスタンス情報があります。CloudShellやマネコンから確認しましょう。
NEW_INSTANCE=`aws backup describe-restore-job --restore-job-id $JOB_ID --query CreatedResourceArn --output text \ | awk -F/ '{ print $2 }'` aws ec2 describe-instances --output yaml \ --query "Reservations[*].Instances[]|[?InstanceId=='$NEW_INSTANCE']" ### 出力サンプル # - AmiLaunchIndex: 0 # Architecture: x86_64 # BlockDeviceMappings: # - DeviceName: /dev/xvda # Ebs: # AttachTime: '2021-01-17T06:53:31+00:00' # DeleteOnTermination: true # Status: attached # VolumeId: vol-01xxxxxxxxxxxxxxx # CapacityReservationSpecification: # CapacityReservationPreference: open # ClientToken: 83xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # CpuOptions: # CoreCount: 1 # ThreadsPerCore: 2 # EbsOptimized: true # EnaSupport: true # HibernationOptions: # Configured: false # Hypervisor: xen # IamInstanceProfile: # Arn: arn:aws:iam::123456789012:instance-profile/xxx # Id: AIPAXXXXXXXXXXXXXXXXX # ImageId: ami-0fxxxxxxxxxxxxxxx # InstanceId: i-0exxxxxxxxxxxxxxx # InstanceType: t3.nano # LaunchTime: '2021-01-17T06:53:30+00:00' # (略)
おわりに
AWS CloudShell から CLIを使って EC2インスタンスのリストアを行ってみました。 マネコンからのリストアのほうが直感的で分かりやすいですが、 手順書としてオペレーションミスの無いようにするにはこちら(CloudShell)の作業のほうが良いのではないでしょうか。
以上、少しでも参考になれば幸いです。